﻿Imports System.IO
Imports System.IO.Directory
Imports System.Data
Imports System.Xml
Imports System.Text



Module Fonctions

    'Gestion du clavier
    Public ClSIP As ClassInputPannel

    
    Public Function FctMAJListBox(ByVal strMessage As String, ByVal ctlLstBxData As ListBox, ByVal ctlLstBxToLoad As ListBox) As Boolean

        '**********************************************************************************
        'Fonction permettant la mise à jour d'une listbox a partir des données d'une autre
        '
        'entrée: strMessage => message final permettant d'indiquer la nature et le bon déroulement de l'opération
        '        ctlLstBxData ==> Listbox de référence
        '        ctlLstBxToLoad ==> Listbox à charger
        'sortie: Boolean
        '
        '**********************************************************************************
        Dim i As Integer

        Try
            Call ctlLstBxToLoad.Items.Clear()
            For i = 0 To ctlLstBxData.Items.Count - 1
                Call ctlLstBxToLoad.Items.Add(ctlLstBxData.Items(i))
            Next
            If strMessage <> "" Then
                MsgBox(strMessage, MsgBoxStyle.Exclamation, "Pocket eRelevé")
            End If
            FctMAJListBox = True
        Catch ex As Exception
            Throw New Exception(ex.Message)
            FctMAJListBox = False
        End Try
    End Function

    Public Function ArrangeList_old(ByVal Liste As ListBox) As Boolean
        Dim Tbl$()
        Dim Ntbl$()
        Dim n As Integer
        Dim mtb As Integer
        Dim a As Integer
        Dim tx As String
        Try
            ReDim Tbl(Liste.Items.Count - 1)
            ReDim Ntbl(Liste.Items.Count - 1)
            mtb = Liste.Items.Count - 1
            For n = 0 To mtb
                Tbl(n) = Liste.Items(n)
                Ntbl(n) = ""
            Next n
            Liste.Items.Clear()
            For n = LBound(Tbl) To UBound(Tbl)
                For a = LBound(Tbl) To UBound(Tbl)
                    If a >= n Then
                        If StrComp(Tbl(n).ToString, Tbl(a).ToString, vbTextCompare) = -1 Then
                            tx = Tbl(n).ToString
                            Tbl(n) = Tbl(a)
                            Tbl(a) = tx
                        End If
                    End If
                Next a
            Next n
            For n = UBound(Tbl) To LBound(Tbl) Step -1
                Liste.Items.Add(Tbl(n))
            Next n

            Return True
        Catch ex As Exception
            Throw New Exception(ex.Message)
            Return False
        End Try
    End Function

    Public Function ArrangeListView(ByVal lvListe As ListView, ByVal intColNumber As Integer) As Boolean
        '**************************************************************************************
        'Fonction qui trie les items d'une listview pour une colonne donnée
        'entré : lvListe ==> control listview à trier
        '        intColNumber ==> index de la colonne à trier
        'sortie : Boolean
        '**************************************************************************************

        Try

            'création d'une instance de la classe colHeader avec la colonne souhaitéecomme
            Dim clickedCol As ColHeader = CType(lvListe.Columns(intColNumber), ColHeader)
            ' récupère le nombre d'item dans la liste
            Dim numItems As Integer = lvListe.Items.Count

            ' Set the ascending property to sort in the opposite order.
            'clickedCol.ascending = Not clickedCol.ascending

            'remplit un tableau avec le SortWrapper pour chaque item de la liste
            Dim SortArray As New ArrayList
            Dim i As Integer
            For i = 0 To numItems - 1
                SortArray.Add(New SortWrapper(lvListe.Items(i), intColNumber))
            Next i

            ' Trie les éléments du tableau en utilisant une instance de la classe SortComparer
            ' Paramètres: index de départ
            '             le nombre d'item à trier
            '             IComparer à utiliser pour le trie 

            SortArray.Sort(0, SortArray.Count, New SortWrapper.SortComparer(clickedCol.ascending))

            'Efface la liste et re-remplit avec les items triés du tableau
            lvListe.Items.Clear()
            Dim z As Integer
            For z = 0 To numItems - 1
                lvListe.Items.Add(CType(SortArray(z), SortWrapper).sortItem)
            Next z

            Return True
        Catch ex As Exception
            Throw New Exception(ex.Message)
            Return False
        End Try
    End Function

    Public Function LoadFile(ByVal strFichier As String, ByVal ctlDataSource As System.Windows.Forms.Control) As Boolean
        '**************************************************************************************
        'Fonction qui charge le contenu du fichier dans un control
        'entré : strFichier ==> Chemin du fichier à charger
        '        ctlDataSource ==> Control dans lequel les données seront chargées
        'sortie : Boolean
        '**************************************************************************************
        Dim i As Integer
        Dim line As String = ""

        Try
            ' Create an instance of StreamReader to read from a file.
            Using sr As StreamReader = New StreamReader(strFichier)

                ' Read and display the lines from the file until the end 
                ' of the file is reached.
                'vide les controles
                If ctlDataSource.GetType().ToString = "System.Windows.Forms.TextBox" Then
                    ctlDataSource.Text = ""
                ElseIf ctlDataSource.GetType().ToString = "System.Windows.Forms.ListBox" Then
                    CType(ctlDataSource, System.Windows.Forms.ListBox).Items.Clear()
                ElseIf ctlDataSource.GetType().ToString = "System.Windows.Forms.ListView" Then
                    CType(ctlDataSource, System.Windows.Forms.ListView).Clear()
                ElseIf ctlDataSource.GetType().ToString = "System.Windows.Forms.ComboBox" Then
                    CType(ctlDataSource, System.Windows.Forms.ComboBox).Items.Clear()
                End If

                i = 0
                Do
                    line = sr.ReadLine()
                    If Not line Is Nothing Then
                        If ctlDataSource.GetType().ToString = "System.Windows.Forms.TextBox" Then
                            ctlDataSource.Text = line.ToString()
                        ElseIf ctlDataSource.GetType().ToString = "System.Windows.Forms.ListBox" Then
                            CType(ctlDataSource, System.Windows.Forms.ListBox).Items.Add(line.ToString())
                        ElseIf ctlDataSource.GetType().ToString = "System.Windows.Forms.ListView" Then
                            If i = 0 Then       'remplit les en-tête de colonne avec la première ligne
                                CreateHeadersToListView(line, ctlDataSource)
                            Else        'remplit la listview avec les données
                                PutDataIntoListView(line, ctlDataSource)
                            End If
                        ElseIf ctlDataSource.GetType().ToString = "System.Windows.Forms.ComboBox" Then
                            If i > 0 Then
                                'on s'assure q'il n'y a qu'une seule colonne et si ce n'est pas le cas on choisi la dernière
                                Dim arrStrCol() As String
                                arrStrCol = Split(line, ";")
                                CType(ctlDataSource, System.Windows.Forms.ComboBox).Items.Add(arrStrCol(UBound(arrStrCol)))
                            End If
                        End If
                    End If
                    i = i + 1
                Loop Until line Is Nothing
                sr.Close()
            End Using
            Return True
        Catch ex As Exception
            Throw New Exception(ex.Message)
            Return False
        End Try

    End Function

    Public Function CreateHeadersToListView(ByVal strData As String, ByVal ctlDataSource As System.Windows.Forms.ListView) As Boolean
        '**************************************************************************************
        'Fonction qui créee les en têtes de colonne dans un listView
        'entré : strData ==> Chaine de caractère contenant les en-têtes de colonne séparées par un ";"
        '        ctlDataSource ==> ListView dans lequel les données seront chargées
        'sortie : Boolean
        '**************************************************************************************
        Try
            Dim arrStrCol() As String
            Dim i As Integer
            arrStrCol = Split(strData, ";")

            For i = 0 To UBound(arrStrCol)
                If i = 0 Then
                    'la première colonne est masqué largeur=0 
                    ctlDataSource.Columns.Add(New ColHeader(arrStrCol(i), 0, HorizontalAlignment.Center, False))
                Else
                    'les autres colonnes sont affichées dans le listView et trié par ordre asc
                    ctlDataSource.Columns.Add(New ColHeader(arrStrCol(i), -2, HorizontalAlignment.Left, True))
                End If
            Next

            Return True
        Catch ex As Exception
            Throw New Exception(ex.Message)
            Return False
        End Try

    End Function

    Public Function PutDataIntoListView(ByVal strData As String, ByVal ctlDataSource As System.Windows.Forms.ListView) As Boolean
        '**************************************************************************************
        'Fonction qui charge le contenu du fichier dans un control
        'entré : strData ==> Chaine de caractère contenant les donnéess séparées par un ";"
        '        ctlDataSource ==> ListView dans lequel les données seront chargées
        'sortie : Boolean
        '**************************************************************************************
        Try
            Dim lvItem As ListViewItem
            Dim arrStrCol() As String

            arrStrCol = Split(strData, ";")

            'obligatoire pour afficher toutes les colonnes
            ctlDataSource.View = View.Details

            'création d'un item avec les données du tableau
            lvItem = New ListViewItem(arrStrCol)

            'ajoute l'item au control listview
            ctlDataSource.Items.Add(lvItem)
            Return True
        Catch ex As Exception
            Throw New Exception(ex.Message)
            Return False
        End Try

    End Function

    Public Function CreateHeadersToDataTable(ByVal strData As String, ByVal ctlDataSource As System.Windows.Forms.ListView) As Boolean
        '**************************************************************************************
        'Fonction qui créee les en têtes de colonne dans un listView
        'entré : strData ==> Chaine de caractère contenant les en-têtes de colonne séparées par un ";"
        '        ctlDataSource ==> ListView dans lequel les données seront chargées
        'sortie : Boolean
        '**************************************************************************************
        Try
            Dim arrStrCol() As String
            Dim i As Integer
            arrStrCol = Split(strData, ";")

            For i = 0 To UBound(arrStrCol)
                If i = 0 Then
                    'la première colonne est masqué largeur=0 
                    ctlDataSource.Columns.Add(New ColHeader(arrStrCol(i), 0, HorizontalAlignment.Center, False))
                Else
                    'les autres colonnes sont affichées dans le listView et trié par ordre asc
                    ctlDataSource.Columns.Add(New ColHeader(arrStrCol(i), -2, HorizontalAlignment.Left, True))
                End If
            Next

            Return True
        Catch ex As Exception
            Throw New Exception(ex.Message)
            Return False
        End Try

    End Function

    '**************************************************************************************
    'Fonction qui charge le contenu du fichier dans une datatable
    'IN : strFichier ==> Fichier contenant le contenu à charger dans la dataTable
    'OUT : DataTable ==> Table contenant les données du fichier
    '**************************************************************************************
    Public Function CreateDataTable(ByVal strFichier As String, ByVal dt As DataTable)
        dt.Columns.Clear()
        dt.Rows.Clear()

        Dim arrStrcolHeader() As String
        Dim arrStrcolValue() As String

        Dim i As Integer
        Dim line As String = ""

        Try
            ' Ouverture du fichier en lecture
            Using sr As StreamReader = New StreamReader(strFichier)
                i = 0
                Do
                    line = sr.ReadLine()
                    If Not line Is Nothing Then
                        'remplit les en-tête de colonne avec la première ligne
                        If i = 0 Then
                            arrStrcolHeader = Split(line, ";")
                            For Each ColHeader As String In arrStrcolHeader
                                dt.Columns.Add(ColHeader)
                            Next
                            'remplit la dataSource avec les données
                        Else
                            Dim row As DataRow
                            row = dt.NewRow()
                            arrStrcolValue = Split(line, ";")
                            Dim x As Integer = 0
                            For Each ColValue As String In arrStrcolValue
                                row.Item(x) = ColValue
                                x = x + 1
                            Next
                            dt.Rows.Add(row)
                        End If
                    End If
                    i = i + 1
                Loop Until line Is Nothing
                sr.Close()
            End Using
        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try

        Return dt
    End Function

    '**************************************************************************************
    'Fonction qui sauve le contenu d'une datatable dans un fichier
    'IN : strFichier ==> Chemin du fichier où les données seront stockées
    '   dt ==> DataTable contenant les données
    'OUT : Boolean ==> Symbolise le succès ou l'echec de la sauvegarde
    '**************************************************************************************
    Public Function SaveDataTable(ByVal strFichier As String, ByVal dt As DataTable) As Boolean

        Dim wFile As System.IO.StreamWriter
        Dim line As String

        Try
            wFile = New System.IO.StreamWriter(strFichier)
            Try
                'Ecriture des colonnes
                line = ""
                For i As Integer = 0 To dt.Columns.Count - 1
                    line = line & ";" & dt.Columns.Item(i).ToString
                Next
                line = Right(line, line.Length - 1)
                wFile.WriteLine(line)
                'Ecriture des données
                Dim row As DataRow
                row = dt.NewRow()
                For Each row In dt.Select()
                    line = ""
                    For i As Integer = 0 To row.ItemArray.Length - 1
                        line = line & ";" & row.Item(i).ToString
                    Next
                    line = Right(line, line.Length - 1)
                    wFile.WriteLine(line)
                Next
                dt.Rows.Add(row)
            Catch ex As Exception
                wFile.Close()
            End Try
            Return True
        Catch ex As Exception
            Throw New Exception(ex.Message)
            Return False
        End Try

    End Function

    Public Function Save(ByVal strFichier As String, ByVal objDataSource As Object) As Boolean
        '**************************************************************************************
        'Fonction qui appelle une fonction de sauvegarde en fonction du type de l'objet
        'entré : strFichier ==> Chemin du fichier dans lequel les données seront sauvegardées
        '        strDataSource ==> Objet contenant les données à sauver
        'sortie : Boolean
        '**************************************************************************************

        'Test du type de l'objet
        If objDataSource.GetType().ToString = "System.String" Then  'Si c'est un string
            SaveString(strFichier, CStr(objDataSource))
        ElseIf objDataSource.GetType().ToString = "System.Windows.Forms.TextBox" Then 'Si c'est un textBox
            SaveString(strFichier, CType(objDataSource, System.Windows.Forms.TextBox).Text)
        ElseIf objDataSource.GetType().ToString = "System.Windows.Forms.ListBox" Then 'Si c'est un ListBox
            SaveListBox(strFichier, CType(objDataSource, System.Windows.Forms.ListBox))
        ElseIf objDataSource.GetType().ToString = "System.Windows.Forms.ListView" Then 'Si c'est une ListView
            SaveListView(strFichier, CType(objDataSource, System.Windows.Forms.ListView))
        ElseIf objDataSource.GetType().ToString = "System.Data.DataTable" Then 'Si c'est une ListView
            SaveDataTable(strFichier, CType(objDataSource, System.Data.DataTable))
        End If


    End Function

    Public Function SaveString(ByVal strFichier As String, ByVal strDataSource As String) As Boolean
        '**************************************************************************************
        'Fonction qui sauve le contenu d'un string dans un fichier
        'entré : strFichier ==> Chemin du fichier dans lequel les données seront sauvegardées
        '        strDataSource ==> String contenant les données à sauver
        'sortie : Boolean
        '**************************************************************************************
        Dim wFile As System.IO.StreamWriter

        Try
            wFile = New System.IO.StreamWriter(strFichier)
            Try
                'Ecriture de la chaine de caractère dans le fichier
                wFile.Write(strDataSource)
                wFile.Close()
                Return True
            Catch ex As Exception
                wFile.Close()
            End Try
        Catch ex As Exception
            Throw New Exception(ex.Message)
            Return False
        End Try

    End Function

    Public Function SaveListBox(ByVal strFichier As String, ByVal ctlDataSource As System.Windows.Forms.ListBox) As Boolean
        '**************************************************************************************
        'Fonction qui charge le sauve le contenu d'un control ListeBox dans un fichier
        'entré : strFichier ==> Chemin du fichier dans lequel les données seront sauvegardées
        '        ctlDataSource ==> ListeBox contenant les données à sauver
        'sortie : Boolean
        '**************************************************************************************
        Dim wFile As System.IO.StreamWriter
        Dim i As Integer

        Try
            wFile = New System.IO.StreamWriter(strFichier)
            Try
                If Not (ctlDataSource.Items.Count = 0) Then
                    For i = 0 To ctlDataSource.Items.Count - 1
                        wFile.Write(ctlDataSource.Items(i) & vbCrLf)
                    Next
                End If
                wFile.Close()
                Return True
            Catch ex As Exception
                wFile.Close()
                Throw New Exception(ex.Message)
            End Try
        Catch ex As Exception
            Throw New Exception(ex.Message)
            Return False
        End Try
    End Function

    Public Function SaveListView(ByVal strFichier As String, ByVal ctlDataSource As System.Windows.Forms.ListView) As Boolean
        '**************************************************************************************
        'Fonction qui charge le sauve le contenu d'un control ListeBox dans un fichier
        'entré : strFichier ==> Chemin du fichier dans lequel les données seront sauvegardées
        '        ctlDataSource ==> ListeBox contenant les données à sauver
        'sortie : Boolean
        '**************************************************************************************
        Dim wFile As System.IO.StreamWriter
        Dim colHeader As ColHeader
        Dim lvItem As ListViewItem
        Dim lvSubItem As ListViewItem.ListViewSubItem
        Dim strColHeader As String = ""
        Dim strItem As String = ""

        Try
            wFile = New System.IO.StreamWriter(strFichier)
            If Not (ctlDataSource.Items.Count = 0) Then
                Try
                    'Ecrire les colonnes sur la première ligne
                    For Each colHeader In ctlDataSource.Columns
                        strColHeader = strColHeader & ";" & colHeader.Text
                    Next
                    strColHeader = Replace(strColHeader, ";", "", 1, 1)
                    wFile.Write(strColHeader & vbCrLf)

                    'Ecrire les données sur les lignes suivantes
                    For Each lvItem In ctlDataSource.Items
                        strItem = ""
                        For Each lvSubItem In lvItem.SubItems
                            strItem = strItem & ";" & lvSubItem.Text
                        Next
                        strItem = Replace(strItem, ";", "", 1, 1)
                        wFile.Write(strItem & vbCrLf)
                    Next
                Catch ex As Exception
                    If Not wFile Is Nothing Then
                        wFile.Close()
                    End If
                End Try
            End If
            wFile.Close()
            Return True
        Catch ex As Exception
            MsgBox("Problème : " & strFichier & ex.Message, MsgBoxStyle.Exclamation)
            Return False
        End Try
    End Function

    Public Function Export(ByVal strFileName As String, ByVal strData As String, ByVal strFilter As String) As Boolean
        '**************************************************************************************
        'Fonction qui exporte le contenu d'une chaine de caractère dans un fichier 
        '           et qui permet de sélectionner l'emplacement de ce fichier
        'entré : strFileName ==> Chemin du fichier dans lequel les données seront sauvegardées
        '        strData ==> données à sauver
        '        strFilter ==> Filtre de recherche dans le SaveFileDialog
        'sortie : Boolean
        '**************************************************************************************

        Dim wSaveFileDialog As New SaveFileDialog()
        Dim wFlag As Boolean

        Try
            'si le chemin du fichier est vide alors il faut enregistrer sous
            If strFileName <> "" Then
                SaveString(strFileName, strData)
            Else 'sinon
                wSaveFileDialog.Filter = strFilter
                If wSaveFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
                    wFlag = True
                    'appel récursif à la fonction avec le nom du fichier renvoyé par le SaveFileDialog
                    Export(wSaveFileDialog.FileName, strData, strFilter)
                End If
                wSaveFileDialog.Dispose()
                Return wFlag
            End If
        Catch ex As Exception
            MsgBox("Export non réussi:" & ex.Message, MsgBoxStyle.Exclamation)
        End Try

    End Function

    'Fonction qui permet de créer un "fichier" GPX valide à partir de la trame
    Public Function TrackStringToGPX(ByVal strTrack As String) As String
        Dim strEntete As String = ""
        Dim strCorps As String = ""
        Dim strFin As String = ""

        If strTrack <> "" Then
            strEntete = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""no"" ?>" & vbCrLf
            strEntete = strEntete & "<gpx> " & vbCrLf
            strEntete = strEntete & "<trk>" & vbCrLf
            strEntete = strEntete & "<trkseg>" & vbCrLf
            strCorps = strCorps & strTrack
            strFin = vbCrLf & "</trkseg>" & vbCrLf & "</trk>" & vbCrLf & "</gpx>"
        End If
        Return strEntete & strCorps & strFin
    End Function


    '################################################################################################
    '       Fonctions relatives à l'affichage de la qualité du signal GPS 
    '################################################################################################
    'Fonction qui calcule la taille et la couleur 
    'd'un controle  symbolisant graphiquement la qualité du signal GPS
    'IN : 
    '   txtDop : valeur du DOP; 
    '   intCadreWith : taille du cadre contenant la barre de qualité = taille max que peut prendre la barre
    '   ctlPrecision : controle symbolisant la qualité il sera modifié (taille et couleur) en fonction du DOP
    Public Function CalculatePrecision(ByVal txtDop As String, ByVal intCadreWidth As Integer, ByVal ctlPrecision As Windows.Forms.Label) As Boolean
        If txtDop = "" Then txtDop = "50"
        If intCadreWidth - CType(txtDop, Integer) * (intCadreWidth / 50) > 0 Then
            ctlPrecision.Width = intCadreWidth - CType(txtDop, Integer) * (intCadreWidth / 50)
        Else
            ctlPrecision.Width = 1
        End If
        ctlPrecision.BackColor = GetPrecisionColor(txtDop)
        Return True
    End Function

    'Fonction qui détermine la couleur de la barre de précision
    'Classe de valeur récupérée sur http://en.wikipedia.org/wiki/Dilution_of_precision_%28GPS%29
    'IN : 
    '   intdop : valeur du DOP
    Public Function GetPrecisionColor(ByVal intdop As Integer) As Color
        If intdop <= 1 Then
            Return Color.Blue
        ElseIf intdop <= 2 Then
            Return Color.Green
        ElseIf intdop <= 5 Then
            Return Color.GreenYellow
        ElseIf intdop <= 10 Then
            Return Color.Yellow
        ElseIf intdop <= 20 Then
            Return Color.Orange
        Else
            Return Color.Red
        End If
    End Function

    'Fonction qui change le status de tous les controles "Feu" pour le GPS
    Public Sub ChangeCtlLightGpsStatus(ByVal gpsStatus As CtlLightGPSTrack.GpsLightStatus)
        frmEntryChoixSite.CtlLightGPSTrack.GpsStatus = gpsStatus
        frmEntryChoixTaxon.CtlLightGPSTrack.GpsStatus = gpsStatus
        frmEntryChoixTypeObs.CtlLightGPSTrack.GpsStatus = gpsStatus
        frmEntryGPS.CtlLightGPSTrack.GpsStatus = gpsStatus
        frmEntryWptDescription.CtlLightGPSTrack.GpsStatus = gpsStatus
        frmEntryFin.CtlLightGPSTrack.GpsStatus = gpsStatus
    End Sub

    'Fonction qui change le status de tous les controles "Feu" pour le  Track
    Public Sub ChangeCtlLightTrackStatus(ByVal trackStatus As CtlLightGPSTrack.TrackLightStatus)
        frmEntryChoixSite.CtlLightGPSTrack.TrackStatus = trackStatus
        frmEntryChoixTaxon.CtlLightGPSTrack.TrackStatus = trackStatus
        frmEntryChoixTypeObs.CtlLightGPSTrack.TrackStatus = trackStatus
        frmEntryGPS.CtlLightGPSTrack.TrackStatus = trackStatus
        frmEntryWptDescription.CtlLightGPSTrack.TrackStatus = trackStatus
        frmEntryFin.CtlLightGPSTrack.TrackStatus = trackStatus
    End Sub

    'Fonction qui transtype un string en Nullable of Integer
    'IN : sval Valeur à transtyper
    'OUT : Valeur transtypée si "" alors Nothing sinon integer
    Public Function GetCastStringToNullableInteger(ByVal sval As String) As Nullable(Of Integer)
        Try
            If sval = "" Then
                Return Nothing
            Else
                Return CType(ChangeDecimalSeparator(sval, ".", ","), Nullable(Of Integer))
            End If
        Catch ex As Exception
            Return Nothing
        End Try
    End Function


    '#############################################################################################################################
    '           SAUVEGARDE DES PARAMETRES
    '#############################################################################################################################
    '*****************************************************************************************************
    'Sauvegarde des paramètres Observateurs : Liste des observateurs et Observateurs sélectionnés
    'IN : strDirectoryName => Répertoire où le fichier doit être sauvegardé
    Public Sub SaveObservateur(ByVal strDirectoryName As String)
        'Sauvegarde des données observateurs
        Try
            SaveDataTable(strDirectoryName & "ListeObservateurs.txt", frmParamObservateur.dtObs)
        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
        'Sauvegarde des Observateurs sélectionnés
        Try
            Dim value As String
            value = frmParamObservateur.intIdObs1.ToString & ";" & frmParamObservateur.CmbObs1.Text & vbCrLf
            value = value & frmParamObservateur.intIdObs2.ToString & ";" & frmParamObservateur.CmbObs2.Text & vbCrLf
            Save(strDirectoryName & "DefaultObservateurs.txt", value)
        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
    End Sub

    '*********************************************************************************************************
    'Sauvegarde des données du Track :
    'IN : strDirectoryName => Répertoire où le fichier doit être sauvegardé
    Public Sub SaveTrack(ByVal strFilePathName As String, ByVal strDirectoryName As String)
        Dim DateNom As String = Now.ToString("yyMMdd")

        'Sauvegarde du tracé du GPS dans le fichier TrackGPS.gpx
        Try
            Dim strTrack As String = ""
            'Test s'il y a déjà un fichier track qui existe
            If File.Exists(strDirectoryName & "TrackGPS_" & DateNom & ".gpx") Then
                'Si le fichier existe récupération du track entre les balises
                'Création du document XML
                Dim m_xmld As XmlDocument
                Dim m_node As XmlNode
                Dim m_nodelist As XmlNodeList
                Try
                    m_xmld = New XmlDocument()
                    'Chargement du fichier XML
                    m_xmld.Load(strDirectoryName & "TrackGPS_" & DateNom & ".gpx")
                    m_nodelist = m_xmld.SelectNodes("/gpx/trk/trkseg")
                    For Each m_node In m_nodelist
                        strTrack = strTrack & m_node.InnerXml
                    Next
                Catch ex As Exception

                End Try
            End If
            'Si il y a un track qui a déjà été sauvegardé
            If frmDataTracks.lb_Track.Text <> "" Then
                'Ajout du track existant
                strTrack = strTrack & frmDataTracks.lb_Track.Text()
            End If
            If strTrack <> "" Then
                Save(strFilePathName, TrackStringToGPX(strTrack))
            End If
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Pocket eRelevé")
        End Try

    End Sub

    '*********************************************************************************************************
    'Sauvegarde de la liste des observations
    'IN : strDirectoryName => Répertoire où le fichier doit être sauvegardé
    Public Sub SaveObservation(ByVal strDirectoryName As String, ByRef oListObs As ClsListObservations)
        Dim DateNom As String = Now.ToString("yyMMdd")
        'sauvegarde des données saisies s'il y en a !
        If (oListObs.lstStations().Count > 0) Then
            If (File.Exists(strDirectoryName & "RecupObservation-du_" & DateNom & ".nsml")) Then
                'Suppression de l'ancien fichier
                File.Delete(strDirectoryName & "RecupObservation-du_" & DateNom & ".nsml")
            End If
            Try
                'Sauvegarde des données
                SaveString(strDirectoryName & "RecupObservation-du_" & DateNom & ".nsml", oListObs.ExportListObsTOXML())
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Pocket eRelevé")
            End Try
        End If
    End Sub

End Module
